import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.event.*;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.handler.mxKeyboardHandler;
import com.mxgraph.swing.handler.mxRubberband;
import com.mxgraph.util.mxDomUtils;
import com.mxgraph.util.mxEvent;
import com.mxgraph.util.mxEventObject;
import com.mxgraph.util.mxEventSource.mxIEventListener;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxMultiplicity;

/**
 *
 * Beschreibung
 *
 * @version 1.0 vom 18.02.2015
 * @author 
 */

public class GraphGUI extends JFrame {
    // Anfang Attribute
    private GraphPlotter gp;
    private JPanel jPanel1 = new JPanel(new BorderLayout(), true);
    private JTextArea jTextArea1 = new JTextArea("");
    private JScrollPane jTextArea1ScrollPane = new JScrollPane(jTextArea1);
    private JButton jButtonNeuerKnoten = new JButton();
    private JButton jButtonNeueKante = new JButton();
    private JButton jButtonKnotenFaerben = new JButton();
    private JButton jButtonDateiEinlesen = new JButton();
    private int yPos; // die y-Positon für das Einfügen eines Knotens
    private JButton jButtonEntferneKnoten = new JButton();
    private JTextField jTextFieldKantenGewicht = new JTextField();
    private JButton jButtonEntferneKante = new JButton();
    // Ende Attribute

    public GraphGUI() { 
        // Frame-Initialisierung
        super("GraphPlotter by Fobi-RP-KA based on jgraphx");    
        //setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        int frameWidth = 700; 
        int frameHeight = 502;
        setSize(frameWidth, frameHeight);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - getSize().width) / 2;
        int y = (d.height - getSize().height) / 2;
        setLocation(x, y);
        setResizable(true);
        Container cp = getContentPane();
        cp.setLayout(null);
        yPos=10;

        gp = new GraphPlotter();
        gp.init();
        gp.setGraphComponent(new mxGraphComponent(gp.getGraph()));
        gp.getGraphComponent().getGraphControl().addMouseListener(new MouseAdapter()
            {
                public void mouseReleased(MouseEvent e)
                {
                    Object cell = gp.getGraphComponent().getCellAt(e.getX(), e.getY());
                    Object[] selected = gp.getSelectedListe();
                    //String value = gp.getGraphComponent().getEditingValue(cell, null);
                    if (cell != null && selected != null)
                    {
                        jTextArea1.setText("");
                        for (int i=0; i<selected.length; i++) {
                            if (gp.getGraph().getModel().isVertex(selected[i]))
                                jTextArea1.append("Knoten "+gp.getGraph().getLabel(selected[i])+" ist selektiert!\n");
                            if (gp.getGraph().getModel().isEdge(selected[i]))
                                jTextArea1.append("Kante mit Gewicht "+gp.getGraph().getLabel(selected[i])+" ist selektiert!\n");
                            //jTextArea1.append("\nWert wurde auf "+value+" geändert!");
                        }
                    }
                    else jTextArea1.setText(gp.getAdListe().toString());
                }
            });

        jPanel1.add(gp.getGraphComponent());
        jPanel1.setBounds(8, 8, 521, 353);
        jPanel1.setOpaque(true);
        jPanel1.setVisible(true);
        jPanel1.setBackground(new Color(0xC0C0C0));
        cp.add(jPanel1);
        jTextArea1ScrollPane.setBounds(8, 368, 521, 89);
        cp.add(jTextArea1ScrollPane);
        jButtonNeuerKnoten.setBounds(544, 8, 105, 25);
        jButtonNeuerKnoten.setText("Neuer Knoten");
        jButtonNeuerKnoten.setMargin(new Insets(2, 2, 2, 2));
        jButtonNeuerKnoten.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonNeuerKnoten_ActionPerformed(evt);
                }
            });
        cp.add(jButtonNeuerKnoten);
        jTextArea1.setText(gp.getAdListe().toString());
        jButtonNeueKante.setBounds(544, 72, 81, 25);
        jButtonNeueKante.setText("Neue Kante");
        jButtonNeueKante.setMargin(new Insets(2, 2, 2, 2));
        jButtonNeueKante.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonNeueKante_ActionPerformed(evt);
                }
            });
        cp.add(jButtonNeueKante);

        jButtonKnotenFaerben.setBounds(544, 146, 81, 25);
        jButtonKnotenFaerben.setText("Knoten faerben");
        jButtonKnotenFaerben.setMargin(new Insets(2, 2, 2, 2));
        jButtonKnotenFaerben.addActionListener(new ActionListener()
            { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonKnotenFaerben_ActionPerformed(evt);
                }
            });
        cp.add(jButtonKnotenFaerben);

        jButtonDateiEinlesen.setBounds(544, 368, 105, 25);
        jButtonDateiEinlesen.setText("Datei einlesen");
        jButtonDateiEinlesen.setMargin(new Insets(2, 2, 2, 2));
        jButtonDateiEinlesen.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonDateiEinlesen_ActionPerformed(evt);
                }
            });
        cp.add(jButtonDateiEinlesen);
        jButtonEntferneKnoten.setBounds(544, 40, 105, 25);
        jButtonEntferneKnoten.setText("Entferne Knoten");
        jButtonEntferneKnoten.setMargin(new Insets(2, 2, 2, 2));
        jButtonEntferneKnoten.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonEntferneKnoten_ActionPerformed(evt);
                }
            });
        cp.add(jButtonEntferneKnoten);
        jTextFieldKantenGewicht.setDocument(new NegativeDoubleDocument());
        jTextFieldKantenGewicht.setBounds(632, 72, 25, 25);
        jTextFieldKantenGewicht.setText("8");
        jTextFieldKantenGewicht.setToolTipText("Kantengewicht");
        jTextFieldKantenGewicht.setSelectionStart(0);
        jTextFieldKantenGewicht.setSelectionEnd(25);
        cp.add(jTextFieldKantenGewicht);
        jButtonEntferneKante.setBounds(544, 104, 105, 25);
        jButtonEntferneKante.setText("Entferne Kante");
        jButtonEntferneKante.setMargin(new Insets(2, 2, 2, 2));
        jButtonEntferneKante.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent evt) { 
                    jButtonEntferneKante_ActionPerformed(evt);
                }
            });
        cp.add(jButtonEntferneKante);
        // Ende Komponenten
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    } // end of public GraphGUI

    // Anfang Methoden
    public void jButtonNeuerKnoten_ActionPerformed(ActionEvent evt) {
        yPos = yPos+6;
        gp.erstelleKnoten(455,yPos);
        jTextArea1.setText(gp.getAdListe().toString());
    } // end of jButtonNeuerKnoten_ActionPerformed

    public void jButtonNeueKante_ActionPerformed(ActionEvent evt) {
        Object[] o = gp.getSelectedKnotenListe();
        if (o!=null) {
            if(Double.valueOf(jTextFieldKantenGewicht.getText()).isNaN()) jTextArea1.setText("Bitte eine Zahl beim Kantengewicht eingeben!");
            else if(gp.erstelleKante(o[0],o[1],jTextFieldKantenGewicht.getText()) == null) jTextArea1.setText("Fehler beim Erstellen der Kante!");
            else jTextArea1.setText(gp.getAdListe().toString());
        }
        else jTextArea1.setText("Sie müssen zwei Knoten, den Start- und den Zielknoten auswählen!");
    } // end of jButtonNeueKante_ActionPerformed

    public void jButtonDateiEinlesen_ActionPerformed(ActionEvent evt) {
        if(gp.csvDateiEinlesen()) jTextArea1.setText("Datei erfolgreich eingelesen!");
    } // end of jButtonAusgabe_ActionPerformed

    public void jButtonEntferneKnoten_ActionPerformed(ActionEvent evt) {
        Object o = gp.getSelectedKnoten();
        if (o!=null) {
            if(gp.entferneKnoten(o) == null) jTextArea1.setText("Fehler beim Löschen des Knotens!");
            jTextArea1.setText(gp.getAdListe().toString());
        }
        else jTextArea1.setText("Kein Knoten selektiert!");
    } // end of jButtonEntferneKnoten_ActionPerformed

    public void jButtonEntferneKante_ActionPerformed(ActionEvent evt) {
        Object o = gp.getSelectedKante();
        if (o!=null) {
            if(gp.entferneKante(o) == null) jTextArea1.setText("Fehler beim Löschen der Kante!");
            jTextArea1.setText(gp.getAdListe().toString());
        }
        else jTextArea1.setText("Keine Kante selektiert!");
    } // end of jButtonEntferneKante_ActionPerformed

    public void jButtonKnotenFaerben_ActionPerformed(ActionEvent evt) {
        gp.faerbeKnoten(Integer.valueOf(jTextFieldKantenGewicht.getText()),"lightgreen");
    } // end of jButtonKnotenFaerben_ActionPerformed

    //Testzwecke
    public GraphPlotter getGraphPlotter(){
        return gp;
    }

    // Ende Methoden

    public static void main(String[] args) {
        new GraphGUI();
    } // end of main

} // end of class GraphGUI
